package com.util;

import com.bean.FontStyleBean;
import com.enums.ConsoleFontStyleEnum;

import java.util.ArrayList;
import java.util.List;

public class ConsolePrintColorStrUtil {
    /**
     * 动态生成ANSI转义序列并应用到给定的文本。
     *
     * @param styles  样式列表，包含样式、前景色和背景色等属性。
     * @param content 要格式化的文本内容。
     * @return 应用了ANSI样式的文本。
     */
    private static String formatWithStyles(List<Integer> styles, String content) {
        StringBuilder styleBuilder = new StringBuilder();
        for (int i = 0; i < styles.size(); i++) {
            if (i > 0) {
                styleBuilder.append(";");
            }
            styleBuilder.append(styles.get(i));
        }
        String styleStr = styleBuilder.toString();
        return String.format("\033[%sm%s\033[0m", styleStr, content);
    }

    /**
     * 如果创建对象调用的话  就可以设置新的颜色和字体。
     *
     * @param content 内容
     * @return 返回字符串
     */
    private static String getStyleStr(FontStyleBean fontStyleBean, String content) {
        if (fontStyleBean == null) {
            return null;
        }
        List<Integer> styleList = new ArrayList<>();
        ConsoleFontStyleEnum.Color color = fontStyleBean.getColor();
        ConsoleFontStyleEnum.Pattern pattern = fontStyleBean.getPattern();
        ConsoleFontStyleEnum.BackGroundColor backGroundColor = fontStyleBean.getBackGroundColor();
        List<ConsoleFontStyleEnum.Other> otherStyleList = fontStyleBean.getOtherStyleList();

        if (color != null) {
            styleList.add(color.getValue());
        }
        if (pattern != null) {
            styleList.add(pattern.getValue());
        }
        if (backGroundColor != null) {
            styleList.add(backGroundColor.getValue());
        }
        if (otherStyleList != null) {
            for (ConsoleFontStyleEnum.Other other : otherStyleList) {
                styleList.add(other.getValue());
            }
        }
        return formatWithStyles(styleList, content);
    }

    /**
     * 打印这一行字符串，根据字体样式
     *
     * @param content       内容
     * @param fontStyleBean 字体样式
     */
    public static void printLine(String content, FontStyleBean fontStyleBean) {
        System.out.print(getStyleStr(fontStyleBean, content));
        System.out.println();
    }

    /**
     * 打印这一行字符串，根据字体样式，其中的字符数组和字符样式的长度是一样的
     *
     * @param charsLine      字符数组
     * @param fontStyleBeans 每个字符的样式
     */
    public static void printLine(char[] charsLine, List<FontStyleBean> fontStyleBeans) {
        for (int i = 0; i < charsLine.length; i++) {
            FontStyleBean fontStyleBean = fontStyleBeans.get(i);
            System.out.print(getStyleStr(fontStyleBean, charsLine[i] + ""));
        }
        System.out.println();
    }

    /**
     * 打印字符串列表，字符串列表每个节点都是一样的样式
     *
     * @param lineList          行集合
     * @param fontStyleBeanList 每一行字体样式集合
     * @param sleepTime         打印每一行的间隔时间
     */
    public static void printByLine(List<String> lineList, List<FontStyleBean> fontStyleBeanList, int sleepTime) {
        for (int i = 0; i < lineList.size(); i++) {
            String content = lineList.get(i);
            FontStyleBean fontStyleBean = fontStyleBeanList.get(i);
            printLine(content, fontStyleBean);
            ThreadUtil.sleep(sleepTime);
        }
    }

    /**
     * 打印单个字符，根据字体样式
     *
     * @param c             单个字符
     * @param fontStyleBean 字符样式
     */
    public static void printChar(char c, FontStyleBean fontStyleBean) {
        System.out.print(getStyleStr(fontStyleBean, c + ""));
    }

    /**
     * 打印一行字符，根据字体样式,这一行的字符串都是这个样式
     *
     * @param line          字符串
     * @param fontStyleBean 字体样式
     * @param sleepTime     间隔时间
     */
    public static void printByChar(String line, FontStyleBean fontStyleBean, int sleepTime) {
        char[] chars = line.toCharArray();
        int length = chars.length;
        List<FontStyleBean> fontStyleBeanList = new ArrayList<>();
        for (int i = 0; i < length; i++) {
            fontStyleBeanList.add(fontStyleBean);
        }
        printByChar(chars, fontStyleBeanList, sleepTime);
    }

    /**
     * 逐个字符打印字符数组，根据对应的样式
     *
     * @param charsLine      字符数组
     * @param fontStyleBeans 每个字符的样式
     * @param sleepTime      间隔时间
     */
    public static void printByChar(char[] charsLine, List<FontStyleBean> fontStyleBeans, int sleepTime) {
        for (int i = 0; i < charsLine.length; i++) {
            char c = charsLine[i];
            if (c == ' ') {
                System.out.print(' ');
                continue;
            }
            printChar(c, fontStyleBeans.get(i));
            ThreadUtil.sleep(sleepTime);
        }
        System.out.println();
    }
}